上次我们讲了如何利用Jmeter做接口测试,讲的比较浅,今天来补充一点细节,如何在不同的HTTP Request间传递参数,即前一个请求的输出部分是后一个请求的输入时,应该怎么办
拿上次的教师打分API为例:
要使用这个API,我们发送的HTTP Request Body需要一些特定的信息,例如memberid, token, tokenTime等,上次的例子里我们把它们当作一个个变量保存在外部文件里,但显然不太合适,因为不同用户登录后用到的值都不相同,我们最后动态的获取他们。
下面来看看怎么做:
假设我们的整个测试共有3个HTTP请求,第一步是用户登录,第二步是发送一个query string请求,获取服务器返回的memberid,token,tokentime, 第三步就是把第二步返回的请求填入上述request body,然后发送请求,最终完成打分。
显然我们的传参行为发生在第二步和第三部, 我们先看参数获取,在第二步的HTTP Request请求下,右键点击Add->Post Processors->Regular Expression Extractor
添加后可以看到正则表达式抽取器,我们看如何配置:
位置1:名称及注释
位置2:正则表达式提取内容的范围。(关于各字段的详细说明请查阅协议的相关说明)
位置3:正则表达式提取的相关设置
3.1引用名称:其他地方引用提取值的变量名称,如填写的是:m_id,具体的引用方式是${m_id}
3.2正则表达式:提取内容的正则表达式, 此例中我们需要提取3个参数【稍注意一下: () 表示提取,对于你要提前的内容需要用小括号括起来】。需要注意的是,这3个参数的正则表达式需要是一个,不能分割(就是一个正则匹配所有变量,我本来以为会有分隔符来分割)。
3.3模板:用$$引用起来,如果在正则表达式中有多个提取表达式(多个括号括起来的东东),则可以是$1$,$2$等等,表示解析到的第几个值给m_id,正则表达式的提取模式,值从1开始,值0对应的是整个匹配的表达式
3.4缺省值:正则匹配失败时取缺省值
下面我们给出第二步server的返回值的部分关键内容,结合上图3.2正则表达式的说明,来看下如何填写这个正则表达式:
由上可以看出,3.2正则表达式我们书写的”memberid”:([0-9]).“token”:(“[A-Za-z0-9]“).“tokenTime”:(“[0-9A-Za-z-:.]*”) 可以全部匹配merberid,token, tokenTime的内容。
小技巧:可以google在线正则先去确保正则表达式书写正确,然后再按Jmeter语法写入。
拿到参数值后,如何传入下一个HTTP Request呢,非常简单,直接用第二步正则表达式里我们定义的引用名称(Reference Name)就可以了。本例用${m_id_g1}, ${m_id_g2}, ${m_id_g3} 来分别表示不同的参数。如图所示。
我们只定义了m_id一个引用变量,那么m_id_g1, m_id_g2是什么鬼?看下Jmeter语法:
Suppose you want to match the following portion of a web-page:
name=”file.name” value=”readme.txt” and you want to extract both file.nameand readme.txt.
A suitable regular expression would be:
name=”([^”]+)” value=”([^”]+)”
This would create 2 groups, which could be used in the JMeter Regular Expression Extractor template as $1$ and $2$.
The JMeter Regex Extractor saves the values of the groups in additional variables.
For example, assume:
Reference Name: MYREF
Regex: name=”(.+?)” value=”(.+?)”
Template: $1$$2$
Do not enclose the regular expression in / /
The following variables would be set:
MYREF
file.namereadme.txt
MYREF_g0
name=”file.name” value=”readme.txt”
MYREF_g1
file.name
MYREF_g2
readme.txt
These variables can be referred to later on in the JMeter test plan, as ${MYREF},${MYREF_g1} etc.
明白了吧,对于本例,tempalte用了$0$, 即取所有匹配的表达式,m_id_g1,则表示匹配的表达式里第一个匹配上的内容,m_id_g2就表示第2个,因为我们有正则匹配上3个符合的内容,g1,g2,g3分别表示这3个。
以上就是如何应用jmeter传参,更多内容敬请关注iTesting。